안녕하세요. 저는 시드니 대학교에서 컴퓨터 공학을 공부하고 있는 1학년 김용현이라고 합니다. 본 리포트는 전문성은 없지만 저와 같이 주식에 입문하지 얼마 안 된 주린이라면 궁금할 만한 의문들을 학교에서 배운 기본적인 통계 지식과 R을 이용해 분석한 내용을 담고 있습니다. 이 리포트의 내용은 하나부터 열까지 저의 주관적인 논리가 바탕이 되므로 흥미 위주로만 읽어주시면 감사하겠습니다 :)
출처: yahoo finance
소개: 1999년 3월 15일 부터 2022 5월
27일까지의 QQQ 데이터
내용: 일별로 QQQ의 시작가, 고점, 저점, 종가,
그리고 거래량이 기재되어 있음
library(plotly)
library(tidyverse)
qqq = read.csv("qqq_history.csv")
str(qqq)
## 'data.frame': 5842 obs. of 7 variables:
## $ Date : chr "1999-03-15" "1999-03-16" "1999-03-17" "1999-03-18" ...
## $ Open : num 50.4 51.7 51.9 51.5 53.2 ...
## $ High : num 51.6 52.2 52 52.6 53.2 ...
## $ Low : num 49.9 51.2 51.4 51.5 51.2 ...
## $ Close : num 51.5 51.9 51.6 52.6 51.2 ...
## $ Adj.Close: num 44.6 44.9 44.6 45.5 44.3 ...
## $ Volume : int 6369000 4905800 3965000 4848400 7160400 5024800 10962400 8447000 8133800 8256200 ...
# Number Dates
data_size = dim(qqq)[1]
qqq <- qqq %>% mutate(DateNum = 1:data_size)
# Add Year
date_split = str_split(qqq$Date, "-")
year_ls = c()
for (date in date_split){
year = as.integer(str_split(date, "-")[1])
year_ls = c(year_ls, year)
}
qqq <- qqq %>% mutate(Year = year_ls)
PriceByYear = qqq %>% group_by(Year) %>% summarise(price = mean(Close))
# PriceByYear
VolumeByYear = qqq %>% group_by(Year) %>% summarise(volume = mean(Volume))
# VolumeByYear
plot_ly(PriceByYear,
x = ~Year,
y = ~price,
size = ~VolumeByYear$volume * price *2,
type = "scatter",
hoverinfo = "text",
hovertext = paste0("년도: ", PriceByYear$Year,
"<br>평균 가격: $", round(PriceByYear$price, 2),
"<br>평귱 거래량: $", round(VolumeByYear$volume * PriceByYear$price / 1000000), "M")
)
record = c()
record_sum = c()
sum = 0
for (i in 1:data_size){
day = qqq[i,]
diff = (day$Close - day$Open) / day$Open
sum = sum + diff
record = c(record, diff)
record_sum = c(record_sum, sum)
}
qqq <- qqq %>% mutate(record_sum) %>% mutate(record)
plot_ly(qqq,
x = ~DateNum,
y = ~record,
color = ~Year,
type = "scatter",
mode = "markers"
)
plot_ly(qqq,
x = ~DateNum,
y = ~record_sum,
color = ~Year,
type = "scatter",
mode = "markers"
)
simulator <- function(initial, deposit, leverage, row){
portfolio = initial
pf_record = rep(portfolio, row)
deposit_record = rep(portfolio, row)
for (i in (1+row):data_size){
if (i %% 5 == 0){
portfolio = portfolio + deposit
deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
} else{
deposit_record = c(deposit_record, tail(deposit_record, n=1))
}
diff_ls = c()
for (j in (i-row):(i-1)){
day = qqq[j,]
diff = (day$Close - day$Open) / day$Open
diff_ls = c(diff_ls, diff)
}
today = qqq[i,]
today_diff = (today$Close - today$Open) / today$Open
if ( mean(diff_ls > 0) == 1){ # + in a row, so guess -
if (today_diff > 0){ # wrong (today = +)
portfolio = portfolio * (1 - abs(today_diff)*leverage)
} else if(today_diff < 0){ # right (today = -)
portfolio = portfolio * (1 + abs(today_diff)*leverage)
}
} else if( mean(diff_ls < 0) == 1){ # - in a row, so guess +
if (today_diff > 0){ # right (today = -)
portfolio = portfolio * (1 + abs(today_diff)*leverage)
} else if (today_diff < 0){ # wrong (today = +)
portfolio = portfolio * (1 - abs(today_diff)*leverage)
}
} else{
portfolio = portfolio
}
pf_record = c(pf_record, portfolio)
}
return (list(pf_record, deposit_record))
}
flow_simulator <- function(initial, deposit, leverage, row){
portfolio = initial
pf_record = rep(portfolio, row)
deposit_record = rep(portfolio, row)
for (i in (1+row):data_size){
if (i %% 5 == 0){
portfolio = portfolio + deposit
deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
} else{
deposit_record = c(deposit_record, tail(deposit_record, n=1))
}
diff_ls = c()
for (j in (i-row):(i-1)){
day = qqq[j,]
diff = (day$Close - day$Open) / day$Open
diff_ls = c(diff_ls, diff)
}
today = qqq[i,]
today_diff = (today$Close - today$Open) / today$Open
if( mean(diff_ls < 0) == 1){ # - in a row, so guess -
if (today_diff > 0){ # wrong (today = -)
portfolio = portfolio * (1 - abs(today_diff)*leverage)
} else if (today_diff < 0){ # right (today = +)
portfolio = portfolio * (1 + abs(today_diff)*leverage)
}
} else{
portfolio = portfolio
}
pf_record = c(pf_record, portfolio)
}
return (list(pf_record, deposit_record))
}
daily_get <- function(initial, deposit, leverage){
portfolio = initial
pf_record = c(initial)
deposit_record = c(initial)
for (i in 2:data_size){
if (i %% 5 == 0){
portfolio = portfolio + deposit
deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
} else{
deposit_record = c(deposit_record, tail(deposit_record, n=1))
}
yesterday = qqq[i-1,]
today = qqq[i,]
diff = (today$Open - yesterday$Open) / yesterday$Open
portfolio = portfolio * (1 + diff*leverage)
pf_record = c(pf_record, portfolio)
}
return (list(pf_record, deposit_record))
}
r_simulator <- function(initial, deposit, leverage){
portfolio = initial
pf_record = c(initial)
deposit_record = c(initial)
for (i in 2:data_size){
if (i %% 5 == 0){
portfolio = portfolio + deposit
deposit_record = c(deposit_record, tail(deposit_record, n=1) + deposit)
} else{
deposit_record = c(deposit_record, tail(deposit_record, n=1))
}
today = qqq[i,]
today_diff = (today$Close - today$Open) / today$Open
guess = sample(c(1,-1), 1, replace=T)
if (guess * today_diff > 0){
portfolio = portfolio * (1 + abs(today_diff)*leverage)
} else{
portfolio = portfolio * (1 - abs(today_diff)*leverage)
}
pf_record = c(pf_record, portfolio)
}
return (list(pf_record, deposit_record))
}
draw_plot <- function(result){
pf_record = result[[1]]
deposit_record = result[[2]]
SIM <- qqq %>% mutate(pf_record) %>% mutate(deposit_record)
P = plot_ly(SIM,
x = ~DateNum,
y = ~pf_record,
color = ~Year,
type = "scatter",
hoverinfo = "text",
hovertext = paste0("날짜: ", SIM$Date,
"<br>평가액: $", round(pf_record/1000000, 2), "M")
)
P <- P %>% add_trace(y = ~deposit_record, name = "본전",
mode = "markers", color = "Red")
layout(P,
yaxis = list(title = "포트폴리오 평가액", type="log")
)
}
initial = 10000
deposit = 1000
result = simulator(initial, deposit, 3, 1)
draw_plot(result)
result = simulator(initial, deposit, 6, 1)
draw_plot(result)
result = simulator(initial, deposit, 3, 2)
draw_plot(result)
result = simulator(initial, deposit, 6, 2)
draw_plot(result)
result = simulator(initial, deposit, 3, 3)
draw_plot(result)
result = simulator(initial, deposit, 6, 3)
draw_plot(result)
result = flow_simulator(initial, deposit, 3, 2)
draw_plot(result)
result = flow_simulator(initial, deposit, 6, 2)
draw_plot(result)
result = flow_simulator(initial, deposit, 3, 1)
draw_plot(result)
result = flow_simulator(initial, deposit, 6, 1)
draw_plot(result)
result = daily_get(initial, deposit, 1)
draw_plot(result)
result = daily_get(initial, deposit, 3)
draw_plot(result)
result = daily_get(initial, deposit, 6)
draw_plot(result)